home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / cmdline.doc < prev    next >
Text File  |  1985-06-03  |  7KB  |  132 lines

  1. CMDLINE.DOC           7/8/84        Dave Williams [COMPUSERVE 74015,655]
  2.  
  3.  
  4. A. Listing 1 is a routine designed to enable the use of command line
  5. parameters by either compiled or interpreted BASIC programs.  The
  6. routine is based on the following algorithm:
  7.  
  8.     (1) Determine if the program is compiled or not. (Line 1010)
  9.  
  10.         a. If the program using this routine also uses array variables,
  11. then line 1010 could use one of those variables instead of TEMP$().
  12.  
  13.  
  14.     (2) Find the start of a Program Segment Prefix (PSP) that contains
  15. the desired command line. (Line 1020)
  16.  
  17.         a. The PSP for BASIC.COM (or BASICA.COM) is easy to find. Simply
  18. look at the vector address for INT 0.  The segment address portion of
  19. this vector points to BASIC's PSP.  (BASIC substitutes its own interrupt
  20. handler routines for this and several other interrupts, in addition to
  21. setting up new interrupts of its own.  As a COM program, only one program
  22. segment address (such as that for INT 0) is needed.)
  23.  
  24.         b. The PSP for a compiled BASIC program, on the other hand, is
  25. pretty well hidden, and normally can't be found by looking at the
  26. interrupt vector addresses.  (A compiled BASIC program is usually a EXE
  27. program and typically use several different program segment addresses.)
  28. Instead a method such as that given by W.M. Sparks in PC World (Nov 83,
  29. p.260) must be used.  His program, known as BASPARM.BAS (or
  30. BASPARAM.BAS) is widely available.
  31.  
  32.         c. The routine given here makes use of the fact that DOS places
  33. a copy of the command line in the PSP for COMMAND.COM when any EXE or COM
  34. program is called.  This PSP can be found by simply looking at the vector
  35. address for INT 21.
  36.  
  37.     (3) Read in the command line from the command line buffer in the PSP.
  38. (Lines 1030-1050)
  39.  
  40.         a. The length of the command line is given by the byte at hex
  41. offset 80 in the PSP, while the command line itself starts at hex offset
  42. 81.
  43.  
  44.         b. Line 1040 of the routine is not needed for proper operation.
  45. It is included only to provide for a fast exit if the command line is
  46. empty.
  47.  
  48.     (4) Delete any leading spaces. (Line 1070)
  49.  
  50.     (5) If the program is not compiled, then delete the name of the
  51. called program. (Lines 1080-1090)
  52.  
  53.         a. When a COM or EXE program is called, DOS will automatically
  54. delete the program filespec from the command line before it is placed
  55. in the PSP.  In the case of interpreted BASIC, this is BASIC.COM (or
  56. BASICA.COM). The filespec of the program to be run by BASIC will remain
  57. as part of the command line, and must be removed.
  58.  
  59.         b. It should be noted that DOS filter and redirection commands
  60. (i.e., those using <,>, or |) will not appear in the command line when
  61. using DOS 2.0 and above.
  62.  
  63.     (6) Strip off leading and trailing spaces. (Lines 1110-1120)
  64.  
  65.  
  66. B. Listing 2 is a routine that may be used to investigate the PC's
  67. memory.  It will first display all of the the interrupt vectors (segment
  68. address first).  It will then display the first 256 bytes of any selected
  69. area of memory. The 256 byte range may be varied by changing the value
  70. of N in line 100.
  71.  
  72.  
  73.  
  74. LISTING 1:
  75.  
  76. 10 'CMDLINE.BAS      Version 2.01         Dave Williams [COMPUSERVE 74015,655]
  77. 20 'This routine is designed to enable the use of command line parameters by either compiled or interpreted BASIC.
  78. 1000 CLS:KEY OFF:DEFINT A-Z
  79. 1010 DIM TEMP$(1):IF (VARPTR(TEMP$(1))-VARPTR(TEMP$(0)))=4 THEN COMPILED=-1
  80. 1020 DEF SEG=0:PSP!=PEEK(134)+256*PEEK(135) 'find PSP for COMMAND.COM
  81. 1030 DEF SEG=PSP!+8:TEMP=PEEK(0) 'find length of command line
  82. 1040 IF TEMP=0 THEN CMDLINE$="":GOTO 1130 'no command line parameters exist
  83. 1050 CMDLINE$=SPACE$(TEMP):FOR I=1 TO TEMP:MID$(CMDLINE$,I,1)=CHR$(PEEK(I)):NEXT 'read in command line
  84. 1060 DEF SEG
  85. 1070 WHILE LEFT$(CMDLINE$,1)=CHR$(32):CMDLINE$=RIGHT$(CMDLINE$,LEN(CMDLINE$)-1):WEND 'strip off leading spaces
  86. 1080 IF COMPILED THEN 1100 ELSE TEMP=1
  87. 1090 TEMP=INSTR(CMDLINE$,CHR$(32)):CMDLINE$=MID$(CMDLINE$,TEMP+1) 'strip off program name (if any)
  88. 1100 IF TEMP=0 OR CMDLINE$=SPACE$(LEN(CMDLINE$)) THEN CMDLINE$="":GOTO 1130 'no command line parameters exist
  89. 1110 WHILE RIGHT$(CMDLINE$,1)=CHR$(32):CMDLINE$=LEFT$(CMDLINE$,LEN(CMDLINE$)-1):WEND 'strip off trailing spaces
  90. 1120 WHILE LEFT$(CMDLINE$,1)=CHR$(32):CMDLINE$=RIGHT$(CMDLINE$,LEN(CMDLINE$)-1):WEND 'strip off leading spaces
  91. 1130 PRINT "Command line = ";CMDLINE$;CHR$(10);"Length =";LEN(CMDLINE$)
  92. 1140 END
  93.  
  94.  
  95.  
  96. LISTING 2:
  97.  
  98. 10 'LOOK.BAS    Version 3.27          7/5/84          Dave Williams [74015,655]
  99. 20 'This program will display all interrupt vector addresses and any 256-byte section of memory.
  100. 30 'Change the value of N in line 100 to change the amount of memory displayed.
  101. 100 KEY OFF:CLS:DEFINT A-N:N=255
  102. 110 DEF FNTST(X)=PEEK(X)+256*PEEK(X+1)
  103. 120 DEF FNTST1$(X)=RIGHT$("0000"+HEX$(X),4)
  104. 130 DEF FNTST2$(X)=RIGHT$("0000",5-LEN(STR$(X)))+RIGHT$(STR$(X),LEN(STR$(X))-1)
  105. 140 DEF FNTST3$(X)=RIGHT$("0000"+HEX$(X),2)
  106. 150 CLS:DEF SEG=0
  107. 160 A$="INT"+SPACE$(4)+"VECTOR"+SPACE$(7)+"ADDRESS"+CHR$(10):PRINT A$
  108. 170 FOR I=0 TO 1023 STEP 4
  109. 180 A$=FNTST3$(I\4)+SPACE$(4)+FNTST1$(FNTST(I+2))+CHR$(58)+FNTST1$(FNTST(I))+SPACE$(6)+FNTST2$(I):PRINT A$
  110. 190 NEXT
  111. 200 PRINT:INPUT "List interrupts again? [Default=N] ",T$:T$=LEFT$(T$,1):IF T$="Y" OR T$="y" THEN 150
  112. 210 PRINT CHR$(10);"[Press <ENTER> to exit]";CHR$(10);"Segment address (in hex) = ";CHR$(9);CHR$(9);"[Add </> to repeat]";
  113. 220 LOCATE ,28:INPUT "",P$:IF P$="" THEN 350
  114. 230 D=INSTR(P$,CHR$(47)):IF D THEN A$=CHR$(47):P$=LEFT$(P$,D-1) ELSE A$=""
  115. 240 P=VAL("&H"+P$):P=P-(P<0)*65536!:P$=FNTST1$(P)
  116. 250 PRINT  "Offset address  (in hex) = ";CHR$(9);CHR$(9);"[Default=0000] [Enter </> to exit]";
  117. 260 LOCATE ,28:INPUT "",O$
  118. 270 D=INSTR(O$,CHR$(47)):IF D THEN O$=LEFT$(O$,D-1):IF O$="" THEN 210
  119. 280 IF O$="" THEN O=0 ELSE O=VAL("&H"+O$):O=O-(O<0)*65536!
  120. 290 CLS:DEF SEG=P
  121. 300 FOR I=0 TO N STEP 16:T$=P$+CHR$(58)+FNTST1$(I+O)+SPACE$(4):U$="":V$=SPACE$(13):FOR J=I TO 15+I
  122. 310 K=PEEK(O+J):U$=U$+RIGHT$("00"+HEX$(K),2)+CHR$(32)
  123. 320 IF K<32 OR K>128 THEN V$=V$+SPACE$(3) ELSE V$=V$+CHR$(K)+SPACE$(2)
  124. 330 NEXT:PRINT T$;U$;CHR$(10);V$:PRINT:NEXT:PRINT
  125. 340 IF A$<>"" THEN 250 ELSE 210
  126. 350 PRINT:INPUT "List interrupts again? [Default=N] ",T$:T$=LEFT$(T$,1):IF T$="Y" OR T$="y" THEN 150
  127. 360 CLS:DEF SEG
  128. 370 END
  129. ault=N] ",T$:T$=LEFT$(T$,1):IF T$="Y" OR T$="y" THEN 150
  130. 360 CLS:DEF SEG
  131. 370 END
  132.